from tkinter import Toplevel, Canvas
from tkinter import ttk
from os import name


###########################################################################################################
def about_program(width: int, height: int, wind_width: int, wind_height: int, icon: Toplevel.wm_iconphoto):
	"""
	Функция создает окно "О программе" с основной информацией.
	width - разрешение экрана по горизонтали.
	height - разрешение экрана по вертикали.
	wind_width - размер будущего окна по горизонтали.
	wind_height - размер будущего окна по вертикали.
	icon - объект с содержащейся в нем картинкой для иконки программы.
	"""
	about_wind = Toplevel()
	about_wind.title("О программе")
	about_wind.geometry(f"{wind_width}x{wind_height}+{(width // 2) - wind_width // 2}+{(height // 2) - wind_height // 2}")
	#about_wind.attributes("-topmost", True)
	about_wind.resizable(False, False)
	about_wind.wm_iconphoto(False, icon)
	about_frame_left = ttk.Frame(about_wind, borderwidth=2, relief="solid", padding=(10,10))
	about_frame_left.pack(side="left", padx = 10)
	about_frame_right = ttk.Frame(about_wind)
	about_frame_right.pack(side="left")

	ttk.Label(about_frame_left, image=icon).pack(side="top", pady=10)
	ttk.Label(about_frame_right, text="Soft install & configure", font=("Arial", 12)).pack(side="top", pady=5, anchor="nw")
	ttk.Label(
				about_frame_right,
				text="   Программа написана на языке Python\n" + \
						"с использованием стандартных библиотек.\n" + \
						"   Автор программы:\n" + \
						"     Никита Александрович Зеленцов.\n"+ \
						"   Почта:\n" + \
						"     zelentsovna@1381.msk.ru",
			).pack(side="top")
	event = "close"
	ttk.Button(about_frame_right, text="Выход", command=lambda: exit_window(about_wind)).pack(side="top", pady=10)


###########################################################################################################
def help_instructions(width: int, height: int, icon: Toplevel.wm_iconphoto, images):
	"""
	Функция создает окно с информацией о том, как пользоваться настоящей порграммой.
	"""
	help_wind = Toplevel()
	help_wind.title("Документация")
	help_wind.geometry(f"700x500+{(width // 2) - 300}+{(height // 2) - 200}")
	help_wind.resizable(False, False)
	help_wind.wm_iconphoto(False, icon)
	help_wind.bind("<Escape>", lambda event: exit_window(help_wind))
	frame_scroll = ttk.Frame(help_wind)
	frame_scroll.pack(expand=True, fill="both")
	canvas = Canvas(frame_scroll, scrollregion=(0, 0, 600, 4530), bg="white")
	vertical = ttk.Scrollbar(canvas, orient="vertical")
	vertical.pack(side="right", fill="y")
	vertical.config(command=canvas.yview)
	canvas.config(yscrollcommand=vertical.set)
	if name == "posix":
		canvas.bind("<Button-4>", lambda event: _on_mouse_wheel(canvas, -1 * event.num))
		canvas.bind("<Button-5>", lambda event: _on_mouse_wheel(canvas, event.num))
	else:
		canvas.bind("<MouseWheel>", lambda event: _on_mouse_wheel(canvas, (-1 * event.delta) / 60))
	canvas.create_text(350, 20, text="Для чего настоящая программа?", font=("Arial", 14), fill="black")
	canvas.create_text(20, 40, text='   Настоящая программа создана для того, чтобы упростить процесс установки необхо-\n' + \
										'димого ПО и настройки станции КЕГЭ для проведения  экзамена по  информатике в 11\n' + \
										'классах. В качестве функций программы можно выделить:\n' + \
										' - полностью автоматическая проверка, установка и настройка необходимых программ\n' + \
										'(в том числе и "Станция КЕГЭ") на компьютере;\n' + \
										' - полуавтоматическая настрока  (подразумевается,  что необходимые программы уже\n' + \
										'установлены;\n' + \
										' - только обновление и настройка программы "Станция КЕГЭ";\n' + \
										' - отдельная проверка  необходимых для  проведения ЕГЭ  по информатике  программ\n' + \
										'и их установка или обновление;\n' + \
										' - обновление ярлыков на рабочем столе;\n'
										' - удаление старой папки Exam и создание новой (пригодится  при подготовке к новому\n' + \
										'экзамену с новой датой).\n'
										'   Программа  имеет свой файл  конфигуриции по пути  "config\\conf.ege", в  котором  со-\n'
										'держатся основные параметры. Через  интерфейс программы  можно загрузить ранее\n'
										'созданный файл конфигурации или сохранить текущие настройки в файл.\n'
										'   Рассмотрим интерфейс программы и то, как пользоваться ей.\n',
								anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 400, text="Главное окно программы", font=("Arial", 14), fill="black")
	canvas.create_image(350, 520, image=images.get("main"))
	canvas.create_text(20, 630, text='   На главном окне программы расположены следующие элементы:\n' + \
										' - строка  меню с пунктами  "Файл", "Параметры"  и "Помощь". "Файл"  содержит в себе\n' + \
										'пункты  "Загрузить  файл  нгастроек",  "Сохранить  настройки  в  файл", "Чек-лист  про-\n' + \
										'грамм", "Обновить ярлыки рабочего стола", "Обновить папку Exam" и "Выход";\n' + \
										' - "Прогресс" выполнения  операции.  Он показывает в процентах  сколько  выполнено\n'
										'на данный момент времени.  По нему  можно  примерно определить сколько  осталось\n' + \
										'до завершения;\n' + \
										' - "Имя папки" с областью, куда можно занести то самое название папки, в которую бу-\n' + \
										'дут копироваться настройки "Станции КЕГЭ" (созданные заранее);\n' + \
										' - "Статус: название статуса". Используется для информирования пользователя о том,\n' + \
										'что в данный момент делает программа. Для удобства статусы раскрашиваются в раз-\n' + \
										'ные цвета;\n' + \
										' - кнопка "Старт". Нужна  для запуска  процесса установки.  В зависимости от настроек,\n' + \
										'кнопка выполняет разные функции. Это будет описано позже.\n' + \
										' - кнопка "Выход". Закрывает программу.\n',
									anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 950, text='Пункт меню "Файл"', font=("Arial", 14), fill="black")
	canvas.create_image(350, 1070, image=images.get("menu_file"))
	canvas.create_text(20, 1180, text='   Пункт "Файл" строки меню содержит следующие элементы:\n' + \
										' -  "Загрузить  файл  настройки".  Функция выполняет  загрузку параметров  программы\n' + \
										'из файла. Файл с конфигурацией имеет расширение ".ege";\n' + \
										' - "Сохранить настройки  в файл". Функция  выполняет сохранение  активных настроек\n' + \
										'программы в файл.\n' + \
										' - "Чек-лист  программ". Функция вызывает окно со  списком  программ, которые  будут\n' + \
										'устанавливаться или обновляться. Это будет описано позже.\n' + \
										' - "Обновить ярлыки". Функция очищает  рабочий стол от  всего, что  на нем есть и зано-\n' + \
										'во создает ярлыки всех программ, а также ярык для папки Exam. В процессе  выполне-\n' + \
										'ния задачи программа в "Статусе" пишет ход работы.\n' + \
										' - "Обновить папку Exam". Функция стирает ярлык папки Exam на рабочем столе, далее\n' + \
										'стирает папку с датой экзамена, создает новую и создает новый ярлык.\n' + \
										'Функция будет полезна, если нужно только обновить папку Exam.\n' + \
										'- "Выход". Закрывает основное окно программы.\n',
									anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 1480, text='Пункт меню "Параметры"', font=("Arial", 14), fill="black")
	canvas.create_image(350, 1600, image=images.get("menu_params"))
	canvas.create_text(20, 1710, text='   Пункт "Параметры" строки меню содержит следующие элементы:\n' + \
										' - "Основные настройки". Функция вызывает окно с настройками  программы. Настрой-\n' + \
										'ки будут описаны позже.\n' + \
										' - "Автоустановка".  Если  стоит  галочка, то при  нажатии  на кнопку  "Старт"  в  главном\n' + \
										'окне программы, запустится автоустановка. При этом будут проверены все программы\n' + \
										'на наличие и будут проверены версии программ. То,  что нужно будет установлено или\n' + \
										'обновлено.  Далее  будет  очищен рабочий  стол,  созданы  необходимые  папки (Exam)\n' +\
										'и будут созданы ярлыки для всех  программ  и  папки Exam.  В завершении  копируется\n' + \
										'папка с настройками  программы  "Станция КЕГЭ".  Во  время  выполнения  программа\n' + \
										'отображает в меню "Статус" на главном окне то, что делается сейчас.\n' + \
										'  Если снять галочку с пункта "Автоустановка", то при нажатии на кнопку "Старт", в глав-\n' + \
										'ном окне программы запустится процесс полуавтоматической установки. При этом под-\n' + \
										'разумевается, что все программы  установлены  и версии актуальны.  Программы прос-\n' + \
										'то очистит рабочий стол, создаст ярлыки, создаст папку Exam, скопирует настройки про-\n' + \
										'граммы "Станция КЕГЭ".\n' + \
										' - "Только установка и настройка КЕГЭ". Если установить галочку  рядом с этим пунктом,\n' + \
										'то программа будет  игнорировать то, что  установлено в  пункте выше. После  нажатия\n' + \
										'на кнопку "Старт" в главном окне  программы, запистится удаление старой  и установка\n' + \
										'новой  версии  программы "Станция  КЕГЕ". Кроме  того, буду  обновлены ярлык  папки\n' + \
										'Exam и скопирована папка с настройками программы "Станция КЕГЕ".\n',
								anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 2120, text='Пункт меню "Помощь"', font=("Arial", 14), fill="black")
	canvas.create_image(350, 2240, image=images.get("menu_help"))
	canvas.create_text(20, 2350, text='   Пункт "Помощь" строки меню содержит следующие элементы:\n' + \
										' - "Документация".  Функция вызывает  окно с настоящей  документацией  к  программе.\n' + \
										' - "О  программе".  Функция  вызывает  окно  с  информацией  о  настоящей  программе.\n',
								anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 2440, text='Окно "Основные настройки"', font=("Arial", 14), fill="black")
	canvas.create_image(350, 2660, image=images.get("settings"))
	canvas.create_text(20, 2870, text='   В  основных  настройках  задаются все пераметры,  которыми пользуется программа.\n' + \
										'Разберем эти параметры по группам:\n' + \
										' - в области "Папка в папке  Exam" можно задавать  название папки,  которая будет там\n' + \
										'создаваться (на нее создается ярлык на рабочем столе). Обычно название папки дает-\n' + \
										'ся по дате, когда проходит экзамен по информатике.\n' + \
										' - в области "Путь  до  фала  конфига"  задается  относительный  или  абсолютный  путь\n' + \
										'до файла с настройками программы.\n' + \
										' - в области  "Путь к  exe файлам" содержится  список  программ и  пути к исполняемым\n' + \
										'файлам. Хотя программа и пытается  сама искать эти файлы, но она наперед не может\n' + \
										'знать, где находится файл той или иной программы в конкретном случае.\n' + \
										' - если вы  знаете, что у вас  что-то установлено точно,  но программа пишет,  что нужно\n' + \
										'установить, то имеет смысл в настройках указать программе путь до exe-файла.\n' + \
										'Записывать абсолютный путь до exe-файла следует в двойных кавычках ("С:\\...").\n' + \
										'- в области "Даты последнего изменения" указаны даты изменения exe-файлов версий,\n' + \
										'которые указаны  на  сайте  РЦОИ  в  требованиях  к  ПО.  Если  требования  меняются,\n' + \
										'то и  даты последнего  изменения  тоже.  Дата  заполняется  числом  вида  "ГГГГММДД"\n' + \
										'Г - год, М - месяц, Д - день.\n' + \
										' - кнопка "Сохранить" сохраняет настройки в файл  и программа обновляет свои значе-\n' + \
										'ния переменных согласно новым значениям. После окно закрывается.\n' + \
										' - кнопка "Выход" закрывает окно настроек.\n',
								anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 3280, text='Окно "Чек-лист программ"', font=("Arial", 14), fill="black")
	canvas.create_image(80, 3300, image=images.get("programm_list_before"), anchor="nw")
	canvas.create_image(360, 3300, image=images.get("programm_list_after"), anchor="nw")
	canvas.create_text(110, 3705, text='До нажатия на кнопку "Проверить"', anchor="nw", font=("Arial", 10), fill="black")
	canvas.create_text(370, 3705, text='После нажатия на кнопку "Проверить"', anchor="nw", font=("Arial", 10), fill="black")
	canvas.create_text(20, 3730, text='  Окно представляет собой список проверяемых программ на  компьютере. Установле-\n' + \
										' ны ли они и если да, то актуальна  ли  версия. При  появлении  окна  напротив  каждой\n' + \
										'программы стоит статус  "Не проверено".  Для запуска  процедуры проверки  программ\n' + \
										'нужно нажать на кнопку  "Проверить"  (картинка слева).  После этого статусы программ\n' + \
										'поменяются на:  "Установить", "Обновить"  или  "Проверено".  Послений  статус значит,\n' + \
										'что  программа  установлена  и версия  актуальна.  Также,  одновременно  с проверкой\n' + \
										'добавляется ещё одна кнопка "Установить необходимое". После нажатия на нее  будет\n' + \
										'ставиться лишь то, что помечено как "Установить" или "Обновить".\n' + \
										'   Если ставить все  программы  на полностью  чистую Windows, то это занимает доста-\n' + \
										'точно продолжительное время.\n' + \
										'  При выполнении установки или обновления программа сообщает об этом в новом ма-\n' + \
										'леньком окошке,  где идет  подсчет  времени,  прошедшего  с  начала  установки  одной\n' + \
										'программы. После статус  меняется на "Установлено" и начинается  установка следую-\n' + \
										'щей по  списку  программы.  По  завершении  появляется  уведомление с  сообщением\n' + \
										'о том, что все программы установлены.\n' + \
										'  Также после  выполнения  процедуры установки всех программ следует повторно  на-\n' + \
										'жать на кнопку "Проверить", дабы убедиться что все необходимое корректно встало.\n' + \
										'  Кнопка "Выход" закрывает настоящее окно.\n',
									anchor="nw", font=("Arial", 12), fill="black")
	canvas.create_text(350, 4100, text='Как устроена папка "resources"', font=("Arial", 14), fill="black")
	canvas.create_image(550, 4100, image=images.get("resources"), anchor="nw")
	canvas.create_text(20, 4120, text='   Основной список файлов  и  папок  представлен на рисунке  справа.\n' + \
										' В папке "eclipse" лежит  сама программа.  Установка ее  заключается\n' + \
										'в копировании этой папки в папку пользователя.\n' + \
										' В папке EGE_KEGE лежат заранее подготовленные настройки прог-\n' + \
										'раммы "Станция  КЕГЕ". Если  вы не хотите  копировать папку с  нас-\n' + \
										'тройками,  то нужно оставить  соответствующее поле в главном  окне\n' + \
										'прораммы пустым.\n' + \
										' В папке "KEGE_program" лежат утсановочные файлы станции КЕГЭ.\n' + \
										'Лежат прямо в  неизменном виде, как поступает в архиве из  личного\n' + \
										'кабинета ППЭ. Нужно только распаковать файл и содержимое скопи-\n' + \
										'ровать в эту папку. В результате должны внутри папки лежать устано-\n' + \
										'вочный файл станции КЕГЭ и папка "Prerequisites".\n' + \
										' В папке  "Office"  хранится  установочные файлы  офиса. Он  должен\n' + \
										'быть заранее подготовлен к  "тихой установке".  Версия 2016  настра-\n' + \
										'ивается запуском файла  "setup.exe" с  ключом "/admin", и  созданием\n' + \
										'MSP-файла, который потом  копируется  в папку "Update"  установоч-\n' + \
										'ной папки.\n' + \
										' Остальные  файлы и папки  идут вместе  с программой.  При измене-\n' + \
										'нии файлов важно  создавать новые с именами  таким же как и на ри-\n' + \
										'сунке.\n',
									anchor="nw", font=("Arial", 12), fill="black")
	canvas.pack(side="left", expand=True, fill="both")


def _on_mouse_wheel(canvas, event):
	canvas.yview_scroll(int(event / 2), "units")


def exit_window(obj: Toplevel):
	obj.destroy()